package com.agent.tools;

import com.agent.config.QQEmailConfig;
import com.agent.entity.Friend;
import com.agent.entity.Group;
import com.agent.entity.GroupFriend;
import com.agent.service.FriendService;
import com.agent.service.GroupFriendService;
import com.agent.service.GroupService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
import jakarta.mail.*;
import jakarta.mail.internet.InternetAddress;
import jakarta.mail.internet.MimeMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.*;
import java.util.stream.Collectors;

/*
    通过QQ邮箱，向群组其它成员发送邮件
    注意：QQ邮箱对外提供 SMTP 服务（smtp.qq.com，端口587/TLS 或 465/SSL）。
    需要使用发件人邮箱对应的「授权码」而非登录密码。
 */

@Component("QQEmailTools")
public class QQEmailTools {

    @Autowired
    private GroupFriendService groupFriendService;
    @Autowired
    private FriendService friendService;
    @Autowired
    private GroupService groupService;
    @Autowired
    private QQEmailConfig qqEmailConfig;

    // 检验用户是否传递授权码
    @Tool(name = "check_isHave",value = "检查用户是否传递授权码，必须从用户消息中获取。" +
            "有关发送邮件操作，第一个调用此工具")
    public String checkIsHave(
            @P(value = "授权码") String authCode
    ) {
        if (authCode == null || authCode.isBlank()) {
            return "提示用户提供授权码来发送QQ邮件";
        }
        return "授权码已提供";
    }

    // 查询当前用户关联的群组的所有群友邮箱和自己的邮箱
    @Tool(name = "get_group_member_emails",
            value = "根据群组名获取同一群组下的所有群友邮箱，支持排除当前用户，返回逗号分隔的邮箱字符串。" +
                    "用户提供授权码后调用此工具。" +
                    "此工具调用后，才调用send_email_via_qq工具。")
    public String getGroupMemberEmails(
            @P(value = "群组名") String groupName,
            @P(value = "当前用户ID，用于排除自己") Long userId
    ) {
        if (groupName == null) {
            return "参数错误：groupName 不能为空";
        }

        // 查询当前用户关联的所有群组的所有自己的群友信息
        List<Friend> friendList = friendService.list(
                new LambdaQueryWrapper<Friend>().eq(Friend::getUserId, userId)
        );
        if (friendList.isEmpty()) {
            return "当前没有关联群组"; // 对应的群组成员信息
        }
        // 获取当前用户邮箱
        String userEmail = friendList.getFirst().getEmail();
        if (userEmail == null || userEmail.isBlank()){
            return "当前用户没有邮箱，请先绑定邮箱";
        }
        // 获取指定群组的所有群友邮箱
        List<Long> list = friendList.stream().map(Friend::getId).toList();
        if (list.isEmpty()){
            System.out.println("获取friend-id失败");
        }
        // 查询当前用户关联的所有群组
        List<Long> groupIds = groupFriendService.list(
                new LambdaQueryWrapper<GroupFriend>().in(GroupFriend::getFriendId, list)
        ).stream().map(GroupFriend::getGroupId).toList();
        List<Group> groupList = groupService.list(new LambdaQueryWrapper<Group>().in(Group::getId, groupIds));

        if (groupList.isEmpty()) {
            System.out.println("当前没有加入任何群组");
            return "当前没有加入任何群组"; // 无成员
        }
        // 获取当前用户指定的群组
        Group group = groupList.stream().filter(g -> g.getName().equals(groupName)).toList().getFirst();
        if (group == null) {
            System.out.println("当前用户没有加入指定群组");
            return "当前用户没有加入指定群组"; // 无成员
        }
        // 获取群组所有群友的 id
        List<Long> friendIds = groupFriendService.list(
                new LambdaQueryWrapper<GroupFriend>().eq(GroupFriend::getGroupId, group.getId())
        ).stream().map(GroupFriend::getFriendId).toList();

        // 查询 Friend 详情（包含 email 与 userId）
        List<Friend> friends = friendService.list(
                new LambdaQueryWrapper<Friend>().in(Friend::getId, friendIds)
        );

        // 过滤：排除当前用户、过滤空邮箱
        List<String> emails = friends.stream()
                .filter(f -> f.getEmail() != null && !f.getEmail().isBlank())
                .filter(f -> userId == null || !Objects.equals(f.getUserId(), userId))
                .map(Friend::getEmail)
                .distinct()
                .collect(Collectors.toList());

        String string = String.join(",", emails);
        return "当前用户邮箱为：" + userEmail + "，" +
                "所处" + groupName + "群组中的群友邮箱为：" + string;
    }

    // 验证授权码所对应的QQ邮箱是否开启POP3/IMAP/SMTP服务
//    @Tool(name = "check_qq_email_auth_code",
//            value = "验证QQ邮箱授权码是否正确以及相关服务是否开启。需要提供QQ邮箱和对应的授权码。" +
//                    "此工具调用后才可调用send_email_via_qq工具")
//    public String checkAuthCode(
//            @P(value = "发送人QQ邮箱地址") String email,
//            @P(value = "发送人QQ邮箱授权码（非登录密码）") String authCode) {
//        if (email == null || email.isBlank()) {
//            return "参数错误：QQ邮箱地址不能为空";
//        }
//        if (authCode == null || authCode.isBlank()) {
//            return "参数错误：授权码不能为空";
//        }
//
//        try {
//            // 配置SMTP服务器
//            Properties props = new Properties();
//            props.put("mail.smtp.auth", "true");
//            props.put("mail.smtp.starttls.enable", "true");
//            props.put("mail.smtp.host", "smtp.qq.com");
//            props.put("mail.smtp.port", "587");
//            props.put("mail.smtp.ssl.enable", "true");
//            props.put("mail.smtp.ssl.trust", "smtp.qq.com");
//
//            // 创建会话
//            Session session = Session.getInstance(props, new Authenticator() {
//                @Override
//                protected PasswordAuthentication getPasswordAuthentication() {
//                    return new PasswordAuthentication(email, authCode);
//                }
//            });
//
//            // 尝试连接SMTP服务器验证授权码
//            Transport transport = session.getTransport("smtp");
//            transport.connect("smtp.qq.com", 587, email, authCode);
//
//            // 如果连接成功，关闭连接并返回成功信息
//            transport.close();
//            return "验证成功：QQ邮箱授权码正确，POP3/IMAP/SMTP服务已开启。";
//
//        } catch (AuthenticationFailedException e) {
//            e.printStackTrace();
//            String errorMessage = e.getMessage();
//            // 检查是否为QQ邮箱服务未开启相关错误
//            if (errorMessage != null &&
//                    (errorMessage.contains("535") ||
//                            errorMessage.contains("Login fail") ||
//                            errorMessage.contains("smtp service is not enabled") ||
//                            errorMessage.contains("POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV"))) {
//                return "验证失败：QQ邮箱未开启POP3/IMAP/SMTP服务。请按以下步骤操作：\n" +
//                        "1. 登录QQ邮箱网页版\n" +
//                        "2. 进入【设置】->【账户】\n" +
//                        "3. 找到【POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务】并开启\n" +
//                        "4. 生成授权码";
//            }
//            return "验证失败：QQ邮箱授权码不正确，请检查邮箱账号和授权码是否正确。";
//        } catch (Exception e) {
//            e.printStackTrace();
//            return "验证失败：" + e.getMessage();
//        }
//    }


    // 使用QQ邮箱 SMTP 向多个邮箱发送邮件
    @Tool(name = "send_email_via_qq",
            value = "使用QQ邮箱SMTP向多个邮箱发送邮件。需要提供发件人邮箱、授权码、收件人（逗号分隔）、主题、正文。授权码必须提供，没有要求用户提交后再调用此方法")
    public String sendEmailViaQQ(
            @P(value = "发件人邮箱（QQ邮箱）") String fromEmail,
            @P(value = "QQ邮箱授权码（非登录密码）") String authCode,
            @P(value = "收件人邮箱，多个用英文逗号分隔") String toEmailsCsv,
            @P(value = "邮件主题") String subject,
            @P(value = "邮件正文（纯文本或简单HTML）") String content
    ) {
        // 获取授权码
//        String authCode = qqEmailConfig.getAuthCode();
        System.out.println("授权码：" + authCode);
        System.out.println("发件人邮箱：" + fromEmail);
        System.out.println("收件人邮箱：" + toEmailsCsv);
        try {
            if (fromEmail == null || fromEmail.isBlank() || authCode == null || authCode.isBlank()) {
                return "参数错误：发件人邮箱和授权码均不能为空";
            }
            if (toEmailsCsv == null || toEmailsCsv.isBlank()) {
                return "参数错误：收件人不能为空";
            }
            // 配置STMP服务器
            Properties props = new Properties();
            props.put("mail.smtp.auth", "true");
            props.put("mail.smtp.starttls.enable", "true");
            props.put("mail.smtp.host", "smtp.qq.com");
            props.put("mail.smtp.port", "587"); // QQ SMTP TLS 端口
//            props.put("mail.smtp.ssl.enable", "true");
//            props.put("mail.smtp.ssl.trust", "smtp.qq.com");
            // 创建会话
            Session session = Session.getInstance(props, new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(fromEmail, authCode);
                }
            });
            // 创建邮箱
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(fromEmail));

            // 解析收件人
            String[] parts = toEmailsCsv.split(",");
            List<InternetAddress> addresses = new ArrayList<>();
            for (String p : parts) {
                String email = p == null ? null : p.trim();
                if (email != null && !email.isEmpty()) {
                    addresses.add(new InternetAddress(email));
                }
            }
            if (addresses.isEmpty()) {
                return "参数错误：收件人邮箱格式不正确";
            }
            message.setRecipients(Message.RecipientType.TO, addresses.toArray(new Address[0]));

            message.setSubject(subject == null ? "" : subject);
            // 尝试用HTML发送；若客户端不支持会回退
            message.setContent(content == null ? "" : content, "text/html; charset=UTF-8");

            Transport.send(message);
            return "发送成功";
        } catch (AuthenticationFailedException e) {
            e.printStackTrace();
            String errorMessage = e.getMessage();
            // 检查是否为QQ邮箱服务未开启相关错误
            if (errorMessage != null &&
                    (errorMessage.contains("535") ||
                            errorMessage.contains("Login fail") ||
                            errorMessage.contains("smtp service is not enabled") ||
                            errorMessage.contains("POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV"))) {
                return "发送失败：QQ邮箱未开启POP3/IMAP/SMTP服务。请按以下步骤操作：\n" +
                        "1. 登录QQ邮箱网页版\n" +
                        "2. 进入【设置】->【账户】\n" +
                        "3. 找到【POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务】并开启\n" +
                        "4. 生成授权码并更新系统配置";
            }
            return "认证失败：" + errorMessage + "。请检查邮箱账号和授权码是否正确。";
        } catch (Exception e) {
            e.printStackTrace();
            return "发送失败：" + e.getMessage();
        }
    }
}
